context locals
As soon as you operate on the global namespace your application isn’t thread-safe any longer.
thread safeにするために、thread localにする。
global オブジェクトだが、thread別にアクセスできるように管理されてる(stack?)
disadvantage: WSGIでは requestごとに threadができる保証はない、というか使いまわされるので、data は thread localに left overされている。(よくわからん)
code: python
from werkzeug.local import Local, LocalManager
local = Local()
local_manager = LocalManager(local) def application(environ, start_response):
local.request = request = Request(environ)
...
application = local_manager.make_middleware(application)
Local()で、ローカルに入れておくオブジェクトを作って、application()の中で local.requestに入れる。
で、middlewareなもので、applicationを作り変える。(作り変えるという表現はよくないかな...)
middlewareは、引数と返り値が、同じインターフェースを持つように作る(イメージのもの)
local.manager が、リクエスト後のcontextの片付けをする。
If you grab a copy of the source for Werkzeug and look in local.py you will see that the Local class basically uses a dictionary with the current thread ID as the key to store and retrieve the right objects transparently. threadID (wsgiの 呼び名は Gunicornならworkerが作るthread?)とリクエストの環境変数の辞書が作られてると。 よく読んで勉強する。